package binaryFile;

import java.io.*;

// 二进制方式
// InputStream读文件
public class InputStreamTest {
    // 打开资源，关闭资源的方式
    public static void main1(String[] args) throws IOException {
        // InputStream是一个抽象类，无法new对象，所以使用它的子类FileInputStream创建对象。OutputStream、Reader、Writer同理

        // 注意：打开文件 关闭文件
        //    一定要记得关闭资源
        InputStream inputStream = new FileInputStream("D:/work/test.txt");
        while (true){
            int b = inputStream.read();
            if (b == -1){   // 注意：当从硬盘中的文件读到内存中的数据读完时，b=-1。
                break;      //      b作为bite的表示范围是：0~255(-128~127)
                            //      此时就是还需要表示-1，所以使用int，就可以满足-1~255的要求
            }

            // 注意：走到这里说明文件还在读
            System.out.println((byte)b);
            // 如果是汉字，可以使用十六进制打印,然后查码表
            // 注意：查看码表网站：http://mytju.com/classcode/tools/encode_utf8.asp
            // System.out.printf("%x\n",(byte)b);
        }
        inputStream.close();
    }

    // 利用try() 自动关闭资源(更推荐使用)、使用字节缓冲区
    public static void main2(String[] args) throws FileNotFoundException {
        // 注意：把资源放在 try()的括号里，那么当代码执行完try，资源就可以自己释放。
        try (InputStream inputStream = new FileInputStream("D:/work/test.txt");){
            while (true){
                // 1、把文件按照字节的方式放入buffer
                byte[] buffer = new byte[1024];
                int len = inputStream.read(buffer);  //注意：read方法读取文件数据放入buffer,返回buffer的长度len
                if(len == -1){
                    break;
                }

                // 2、放入buffer的字节打印，再循环放入，再打印，直到len=-1，表示文件读取结束。
                for (int i = 0; i < len; i++) {
                    System.out.printf("%x\n",buffer[i]);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
